package com.qf.shopping.service.impl;

import com.qf.shopping.common.PassWordUtils;
import com.qf.shopping.dao.BaseDao;
import com.qf.shopping.dao.IUserDao;
import com.qf.shopping.dao.impl.UserDapImpl;
import com.qf.shopping.dto.Email;
import com.qf.shopping.entity.User;
import com.qf.shopping.service.IUserService;
import com.qf.shopping.utils.SendEmail;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * @author 三旬
 * @version 1.0  2022/9/13
 */

public class UserServiceImpl extends BaseServiceImpl<User> implements IUserService {
    IUserDao userDao = new UserDapImpl();

    @Override
    protected BaseDao getBaseDao() {
        return userDao;
    }

    @Override
    public Boolean delChecked(List<Integer> list) {
        return userDao.delChecked(list) > 0;
    }

    @Override
    public Map<String, Object> registerUser(User user) {
        //创建一个map 存放注册成功、失败的提示
        Map<String,Object> map = new HashMap<>();
        //判断用户名是否被注册
        User sqlUser = userDao.selectByName(user.getUserName());
        if(sqlUser != null){
            //用户名存在，返回false
            map.put("msg","用户名已存在！");
            return map;
        }
        //用户名不存在，可以注册，给密码加密
        user.setPassWord(PassWordUtils.saltPwd(user.getPassWord()));
        //新注册的用户默认初始状态：未激活
        //随机生成唯一标识码（激活码）
        String keyCode = UUID.randomUUID().toString().replace("-"," ");
        //将激活码添加到用户信息当中
        user.setKeyCode(keyCode);
        //调用dao层将用户信息插入数据库
        Integer result = userDao.insert(user);
        //判断是否成功注册信息
        if(result > 0){
            //发送邮件给用户，提醒用户去激活账号
            Email email = new Email();
            email.setTitle("商城账号激活提醒");
            email.setContent("欢迎成为我们商城的会员，<a href ='http://localhost:8080/SSOController/activateUser?code=" + keyCode + "'>点击这里激活</a>");
            email.setToUser(user.getEmail());
            try {
                // 邮件发送
                SendEmail.sendEmailInfoUser(email);
                //发送成功返回结果
                map.put("msg","注册成功！请注意查收邮件,激活账号才可以使用！");
                return map;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //插入数据库失败
        map.put("msg","注册失败！");
        return map;
    }

    @Override
    public Integer activateUser(String keyCode) {
        //根据验证码查找相应的用户
        User user = userDao.selectByCode(keyCode);
        //判断用户是否存在
        if (user == null){
            //用户不存在
            return 0;
        }
        //判断用户状态是否是未激活
        if (user.getStatu() == 0) {
            //状态未激活，去激活
            //修改用户状态值
            return userDao.updateUserStatu(user.getId(),1);
        }
        return 0;
    }

    /**
     * 前端的登录处理
     * @param user
     * @return
     */
    @Override
    public Map<String, Object> login(User user) {
        //创建一个map存放用户登录结果反馈
        Map<String,Object> map = new HashMap<>();
        //设置默认状态（失败）
        map.put("code",100);
        //验证用户名是否存在
        //1.查找用户
        User sqlUser = userDao.selectByName(user.getUserName());
        //2.根据结果验证
        if(sqlUser == null){
            //失败原因
            map.put("msg","用户名不存在！");
            return map;
        }
        System.out.println("用户名通过验证");
        //验证密码是否正确
        if (!PassWordUtils.checkPwd(user.getPassWord(),sqlUser.getPassWord())) {
            //密码不正确，脱敏提示
            map.put("msg","用户名或密码错误！");
            return map;
        }
        //检查用户账号的状态（-1:异常、0:未激活、1:正常）
        if(sqlUser.getStatu() == -1){
            //账号状态异常
            map.put("msg","账号状态异常!");
            return map;
        }
        if(sqlUser.getStatu() == 0){
            //账号状态未激活
            map.put("msg","账号状态未激活!");
            return map;
        }
        //通过前面判断，说明账号、密码没有问题
        map.put("code",200);
        //将从数据库中拿到的用户放在map中
        //将密码设置为空值
        sqlUser.setPassWord(null);
        map.put("user",sqlUser);
        //返回结果
        return map;
    }
}
